package com.common.api.iface;

import java.util.EnumSet;

/**
 * @author ficus
 * code name的enum 接口
 */
public interface CodeNameEnumFace {

	/**
	 * @return 获取编码
	 */
	String getEunmCode();
	
	/**
	 * @return 获取名称
	 */
	String getEnumName();
	
	/**
	 * 获取扩展信息
	 * @return
	 */
	default Object getExtInfo() {
		return null;
	}
	
	/**
	 * 根据编码获取枚举类
	 * @param enumClass
	 * @param code
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <E extends Enum<E> & CodeNameEnumFace> E getEnumByCode(Class<E> enumClass, String code) {
		EnumSet<E> set = EnumSet.allOf(enumClass);
		for (Enum<E> enumObj : set) {
			CodeNameEnumFace codeNameEnumFace = (CodeNameEnumFace) enumObj;
			String typeCode = codeNameEnumFace.getEunmCode();
			if (typeCode.equals(code)) {
				return (E) enumObj;
			}
		}
		return null;
	}
	
	/**
	 * 根据编码获取名称
	 * @param code
	 * @param elementType
	 * @return
	 */
	public static <E extends Enum<E> & CodeNameEnumFace> String getNameByCode(Class<E> enumClass,String code) {
		CodeNameEnumFace enums=getEnumByCode(enumClass, code);
		if(enums==null) {
			return null;
		}
		return enums.getEnumName();
	}
	
	/**
	 * 根据名称获取编码
	 * @param name
	 * @param elementType
	 * @return
	 */
	public static <E extends Enum<E> & CodeNameEnumFace> String getCodeByName(Class<E> enumClass,String name) {
		EnumSet<E> set = EnumSet.allOf(enumClass);
		for (Enum<?> enumObj : set) {
			CodeNameEnumFace codeNameEnumFace=(CodeNameEnumFace) enumObj;
			String enumName=codeNameEnumFace.getEnumName();
			if(enumName.equals(name)){
				return codeNameEnumFace.getEunmCode();
			}
		}
		return null;
	}
	
}
